package com.sun.future;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

public class WhenCompleteExample {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println("主线程开始");

        // 创建一个可能失败的任务
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            System.out.println("任务执行线程: " + Thread.currentThread().getName());
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                throw new RuntimeException(e);
            }

            // 模拟50%的失败率
            if (Math.random() > 0.5) {
                throw new RuntimeException("任务执行失败");
            }

            return "任务执行成功";
        });

        // whenComplete: 完成时回调，可以访问结果或异常，但不能改变结果
        CompletableFuture<String> completedFuture = future.whenComplete((result, ex) -> {
            System.out.println("whenComplete执行线程: " + Thread.currentThread().getName());

            if (ex != null) {
                System.err.println("任务完成但有异常: " + ex.getMessage());
            } else {
                System.out.println("任务成功完成: " + result);
            }

            // 注意：这里不能返回新值，只能消费结果
        });

        // 获取原始结果（可能包含异常）
        try {
            System.out.println("最终结果: " + completedFuture.get());
        } catch (Exception e) {
            System.err.println("获取结果时捕获异常: " + e.getCause().getMessage());
        }

        System.out.println("主线程结束");
    }
}
